Validation {drf}

GPT 응답

Django REST Framework Serializer Validation

Django REST Framework (DRF)의 Serializer는 데이터 직렬화 및 역직렬화 과정을 처리하며, 입력 데이터를 검증하는 강력한 메커니즘을 제공합니다. 이 문서에서는 DRF Serializer의 Validation에 대해 설명하고, 유효성 검사를 수행하는 방법과 주요 메서드에 대해 다룹니다.


Validation의 주요 개념

Serializer의 Validation은 입력 데이터를 처리하기 전에 데이터가 유효한지 확인하는 단계입니다. Validation은 일반적으로 다음과 같은 세 가지 수준에서 수행됩니다.

  1. 필드 수준 검증: 각 개별 필드에 대해 정의된 조건을 검증합니다.
  2. 객체 수준 검증: 입력된 데이터 전체에 대해 추가적인 검증 로직을 실행합니다.
  3. 정의된 제약 조건 검증: 모델 또는 특정 요구사항에 따라 자동으로 적용되는 검증입니다.

Validation 구현 방법

1. 필드 수준 검증

필드 수준 검증은 Serializer의 validate_<field_name> 메서드를 사용하여 특정 필드에 대한 유효성 검사를 정의합니다.

from rest_framework import serializers

class ExampleSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=100)
    age = serializers.IntegerField()

    def validate_age(self, value):
        if value < 0:
            raise serializers.ValidationError("Age must be a positive number.")
        return value

동작 원리:


2. 객체 수준 검증

객체 수준 검증은 Serializer의 validate 메서드를 사용하여 여러 필드를 조합한 검증을 수행합니다.

class ExampleSerializer(serializers.Serializer):
    start_date = serializers.DateField()
    end_date = serializers.DateField()

    def validate(self, data):
        if data['start_date'] > data['end_date']:
            raise serializers.ValidationError("Start date must be before end date.")
        return data

동작 원리:


3. validators 옵션

Serializer 필드에 validators 인자를 사용하여 사용자 정의 검증기를 추가할 수 있습니다.

from rest_framework.validators import ValidationError

def multiple_of_ten(value):
    if value % 10 != 0:
        raise ValidationError("This field must be a multiple of ten.")

class ExampleSerializer(serializers.Serializer):
    score = serializers.IntegerField(validators=[multiple_of_ten])

ValidationError

유효성 검사 실패 시 serializers.ValidationError 예외가 발생합니다. 이 예외는 일반적으로 클라이언트로 반환되는 응답에 포함될 수 있는 직렬화된 에러 메시지를 제공합니다.

예:

{
    "age": ["Age must be a positive number."],
    "non_field_errors": ["Start date must be before end date."]
}

참고 사항


예제: 전체적인 Validation 활용

class UserSerializer(serializers.Serializer):
    username = serializers.CharField(max_length=150)
    email = serializers.EmailField()
    password = serializers.CharField(write_only=True)

    def validate_username(self, value):
        if "admin" in value.lower():
            raise serializers.ValidationError("Username cannot contain 'admin'.")
        return value

    def validate(self, data):
        if len(data['password']) < 8:
            raise serializers.ValidationError({"password": "Password must be at least 8 characters long."})
        return data

공식 문서

더 자세한 내용은 DRF 공식 문서를 참조하세요: Django REST Framework Serializer Validation